package com.sweet.thread.unsafe;

/**
 * 死锁产生的四个条件
 * 1.互斥条件 一个资源每次只能被一个进程使用
 * 2.请求与保持条件 一个进程因请求资源而阻塞时，对已有的资源保持不放
 * 3.不可剥夺条件 进程已经获得资源，在还没有使用完之前，不能强行剥夺
 * 4.循环等待 若干进程之间形成一种头尾相接的循环等待资源关系
 */
public class DeadLock {
    public static void main(String[] args) {
        new MakeUp(0,"灰姑娘").start();
        new MakeUp(1,"白雪公主").start();
    }
}

// 口红
class Lipstick {
}

// 镜子
class Mirror {
}

// 化妆
class MakeUp extends Thread {
    // 需要的对象只有一份 使用static来表示
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choose;
    String name;

    public MakeUp(int choose, String name) {
        this.choose = choose;
        this.name = name;
    }

    @Override
    public void run() {
        makeup();
    }

    private void makeup() {
        if(choose == 0) {
            synchronized (lipstick) { // 获得口红
                System.out.println(name + "持有了口红");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (mirror) {
                    System.out.println(name + "持有了镜子");
                }
            }
            /*synchronized (mirror) {
                System.out.println(name + "持有了镜子");
            }*/
        } else {
            synchronized (mirror) { // 获得镜子
                System.out.println(name + "持有了镜子");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lipstick) {
                    System.out.println(name + "持有了口红");
                }
            }
            /*synchronized (lipstick) {
                System.out.println(name + "持有了口红");
            }*/
        }
    }
}